/*****************************************************************************
 *                     Projet de HCR : Annuaire distribué                    *
 *                      Guillaume MONTAVON (Master 2 RIM)                    *
 *                                                                           *
 *      Gestion de l'annuaire avec la possibilité d'ajouter de supprimer     *
 *       de rechercher ou d'afficher tous les contacts de notre annuaire     *
 *****************************************************************************/
 
#include "annuaire.h"

//Ajoute une personne à l'annuaire (nom et num donné en paramètre)
annuaire ajouterAnnuaire(annuaire annu, char *nom, char *tel) {
	// On crée un nouvel élément
	element* nouvelElement = malloc(sizeof(element));
	
	if ((nouvelElement->nom = (char *) malloc (TAILLE_TEL * sizeof (char))) != NULL && 
		(nouvelElement->tel = (char *) malloc (TAILLE_TEL * sizeof (char))) != NULL) {
		strcpy(nouvelElement->nom, nom);
		strcpy(nouvelElement->tel, tel);
	}

	/* On ajoute en fin, donc aucun élément ne va suivre */
	nouvelElement->nxt = NULL;
 
	if(annu == NULL) // Si l'annu est vide il suffit de renvoyer l'élément créé
		return nouvelElement;
	else {
		//Sinon, on parcourt l'annuaire et on indique que le dernier élément est relié au nouvel élément
		element* temp=annu;
		while(temp->nxt != NULL)
			temp = temp->nxt;
		temp->nxt = nouvelElement;
		return annu;
	}
}


//Affiche tous les contact enregistrés dans l'annuaire
void afficherAnnuaire(annuaire annu) {
	
	if(estVide(annu))
		fprintf(stdout, "L'annuaire est vide\n");

	element *tmp = annu;
	while(tmp != NULL) {
		fprintf(stdout, "%s : %s \n", tmp->nom, tmp->tel);
		tmp = tmp->nxt;
	}
}

//Retourne 1 si l'annuaire est vide, sinon 0
int estVide(annuaire annu) {
	return (annu == NULL)? 1 : 0;
}

//Supprime la dernière personne enregistré dans l'annuaire
annuaire supprimerDernierePersonne(annuaire annu) {
	// Si l'annuaire est vide, on retourne NULL
	if(annu == NULL)
		return NULL;
 
	// Si l'annuaire contient un seul élément
	if(annu->nxt == NULL) {
		// On le libère et on retourne NULL (l'annuaire est maintenant vide)
		free(annu->nom);
		free(annu->tel);
		free(annu);
		return NULL;
	}
 
	// Si l'annuaire contient au moins deux éléments
	element* tmp = annu;
	element* ptmp = annu;
	while(tmp->nxt != NULL) {
		ptmp = tmp;
		tmp = tmp->nxt;
	}
	// tmp pointe sur le dernier élément, et ptmp sur l'avant-dernier. L'avant-
	// dernier devient la fin de l'annuaire et on supprime le dernier élément
	ptmp->nxt = NULL;
	free(tmp->nom);
	free(tmp->tel);
	free(tmp);
	return annu;
}

//Recherche une personne dans l'annuaire (nom demandé en paramètre) et la retourne
annuaire rechercherPersonne(annuaire annu, char *nom) {
	element *tmp=annu;
	while(tmp != NULL) {
		if(strcmp(tmp->nom, nom) == 0) // Si le nom correspond, on renvoie son adresse
			return tmp;
		tmp = tmp->nxt;
	}
	return NULL;
}

//Permet d'obtenir le numéro de tel (dernier paramètre) d'une personne dont le 
// nom est donnée en paramètre
int obtenirNumTel(annuaire annu, char *nom, char *telTrouve) {
	annuaire personne = NULL;
	personne = rechercherPersonne(annu, nom);
	if(personne != NULL) {
		strcpy(telTrouve, personne->tel);
		return 1;
	}
	else {
		strcpy(telTrouve, "inconnu");	
		return -1;
	}
}

//Permet d'utilisé l'annuaire comme un tableau en obtenant un élément en donnant son indice
annuaire getPersonneById(annuaire annu, int indice) {
	int i;
	// On se déplace de i cases, tant que c'est possible
	for(i=0; i<indice && annu != NULL; i++)
		annu = annu->nxt;
	
	// Si l'annuaire contient moins de i éléments
	if(annu == NULL)
		return NULL;
	else // Sinon on renvoie l'adresse de l'élément i
		return annu;
		
}

//Retourne le nombre de personnes enregistrées
int tailleAnnuaire(annuaire annu) {
	// Si l'annuaire est vide, il y a 0 élément
	if(annu == NULL)
		return 0;
	
	return tailleAnnuaire(annu->nxt)+1;
}

//Supprime une personne dont le nom est donné en paramètre
annuaire supprimerPersonne(annuaire annu, char *nom) {
	// annuaire vide, il n'y a rien à supprimer
	if(annu == NULL)
		return NULL;
	
	// Si l'élément en cours de traitement doit être supprimé
	if(strcmp(annu->nom, nom) == 0) {
		element* tmp = annu->nxt;
		free(annu->nom);
		free(annu->tel);
		free(annu);
		// L'élément ayant été supprimé, l'annuaire commencera à l'élément suivant
		tmp = supprimerPersonne(tmp, nom);
		return tmp;
	}
	else {
		// Si l'élement ne doit pas être supprimé, alors l'annuaire commencera par cet élément
		annu->nxt = supprimerPersonne(annu->nxt, nom);
		return annu;
	}
}

//Vide l'annuaire
annuaire effacerAnnuaire(annuaire annu) {
	if(annu == NULL) // Si l'annuaire est vide, il n'y a rien à effacer
		return NULL;
	else {
		// Sinon, on efface le premier élément et on retourne le reste de l'annuaire effacé
		element *tmp;
		tmp = annu->nxt;
		free(annu->nom);
		free(annu->tel);
		free(annu);
		return effacerAnnuaire(tmp);
	}
}

//Importe une liste de personne contenu dans un fichier texte dans l'annuaire
annuaire importerAnnuaire(annuaire annu, char *nomFichier) {
	FILE* fichier = NULL;
	int ligne = 1;
	char nom[TAILLE_TEL] = "";
	char tel[TAILLE_TEL] = "";
	
	fichier = fopen(nomFichier, "r");
	if(fichier == NULL)
		fprintf(stderr, "Erreur lors de l'ouverture du fichier : %s\n",nomFichier);
	else {
		while(fscanf(fichier, "%s\t%s", nom, tel) != EOF){
			annu = ajouterAnnuaire(annu, nom, tel);
			//fprintf(stderr, "ligne %d : %s -> %s\n", ligne, nom, tel);
			ligne++;
		}
	
		fprintf(stdout, "Chargement du fichier '%s' effectuee\n", nomFichier);
		//fprintf(stdout, "Nombre de lignes du fichier : %d\n\n", ligne-1);
		fclose(fichier);
	}
	return annu;
}

//Exporte les contacts de l'annuaire dans contenu dans un fichier texte
int exporterAnnuaire(annuaire annu, char *nomFichier){

	FILE *fichier = NULL;
	fichier = fopen(nomFichier, "w");	
	if(fichier == NULL) {
		fprintf(stderr, "Erreur lors de l'ouverture du fichier : %s\n",nomFichier);
		return -1;
	}
	
	annuaire personne = NULL;
	int i;
	for(i = 0; i<tailleAnnuaire(annu); i++) {
		personne = getPersonneById(annu, i);
		//fprintf(stderr, "%s\t%s\n", personne->nom, personne->tel);
		fprintf(fichier, "%s\t%s\n", personne->nom, personne->tel);
	}
	
	fclose(fichier);
	
	return 1;
}
